home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / PROGBLER / ASMCODE2.LZH / ASC_BIN.ASM next >
Assembly Source File  |  1983-09-17  |  4KB  |  121 lines

  1. ;asc-bin.asm
  2. ;converts a string of numbers to a signed 16 bit number
  3. STACK SEGMENT PARA STACK 'STACK'
  4.        DB 64 DUP('STACK ')
  5. STACK ENDS
  6.  
  7. CODE SEGMENT PARA 'CODE'
  8.  
  9. ASCII_BIN PROC FAR
  10.           ASSUME CS:CODE,SS:STACK
  11.           PUBLIC ASCII_BIN
  12.  
  13.        PUSH BX          ;SAVE BX AND CX
  14.        PUSH CX
  15.        SUB  AX,AX       ;TO START, RESULT = 0
  16.        SUB  DX,DX       ;  DECIMAL COUNT = 0
  17.        MOV  DI,0FFH     ;  ASSUME NO BAD CHARACTERS
  18.        CMP  CX,7        ;STRING TOO LONG?
  19.        JA   NO_GOOD     ;IF SO, GO SET CF AND EXIT
  20.        
  21. BLANKS:
  22.        CMP  BYTE PTR [BX],' '   ;SCAN PAST LEADING BLANKS
  23.        JNE  CHK_NEG
  24.        INC  BX
  25.        LOOP BLANKS
  26.  
  27. CHK_NEG:
  28.        CMP  BYTE PTR [BX],'-'   ;NEGATIVE NUMBER?
  29.        JNE  CHK_POS
  30.        INC  BX                  ;IF SO INCREMENT POINTER
  31.        DEC  CX                  ;   DECREMENT THE COUNT
  32.        CALL CONV_AB             ;   AND CONVERT THE STRING
  33.  
  34.        JC   THRU
  35.        CMP  AX,32768            ;IS THE NUMBER TOO SMALL?
  36.        JA   NO_GOOD
  37.        NEG  AX                  ;NO. COMPLEMENT THE RESULT
  38.        JS   GOOD
  39.  
  40. CHK_POS:
  41.        CMP  BYTE PTR [BX],'+'   ;POSITIVE NUMBER?
  42.        JNE  GO_CONV
  43.        INC  BX                  ;IF SO, INCREMENT POINTER
  44.        DEC  CX                  ;   DECREMENT THE COUNT
  45. GO_CONV:
  46.        CALL CONV_AB             ;   AND CONVERT THE STRING
  47.  
  48.        JC   THRU
  49.        CMP  AX,32767            ;IS THE NUMBER TOO BIG?
  50.        JA   NO_GOOD
  51. GOOD:
  52.        CLC
  53.        JNC  THRU
  54. NO_GOOD:
  55.        STC                      ;IF SO, SET CARRY FLAG
  56. THRU:
  57.        POP  CX                  ;RESTORE REGISTERS
  58.        POP  BX
  59.        RET                      ;EXIT
  60.  
  61. ASCII_BIN ENDP
  62. ;
  63. ;   THIS PROCEDURE PERFORMS THE ACTUAL CONVERSION.
  64. ;
  65. CONV_AB PROC
  66.        PUSH BP          ;SAVE SCRATCH REGISTERS
  67.        PUSH BX
  68.        PUSH SI
  69.  
  70.        MOV  BP,BX       ;IS THIS NECESSARY     ******NOT IN BOOK
  71.  
  72. CHK_PT:
  73.        CMP  DX,0        ;DICIMAL POINT ALREADY FOUND?
  74.        JNZ  RANGE       ;  IF SO, SKIP FOLLOWING CHECK
  75.        CMP  BYTE PTR DS:[BP],'.'   ;DECIMAL POINT
  76.        JNE  RANGE
  77.        DEC  CX          ;IF SO DECREMENT COUNT
  78.        MOV  DX,CX       ;  AND RECOR IT IN DX
  79.        JZ   END_CONV    ;  EXIT IF CX=0
  80.        INC  BP          ;  INCREMENT POINTER
  81.  
  82. RANGE:
  83.        CMP  BYTE PTR DS:[BP],'0'  ;IF THE CHARACTER IS
  84.        JB   NON_DIG               ;  NOT A DIGIT
  85.        CMP  BYTE PTR DS:[BP],'9'
  86.        JBE  DIGIT
  87.  
  88. NON_DIG:
  89.        MOV  DI,BP        ;PUT ITS ADDRESS IN DI
  90.        STC               ;SET THE CARRY FLAG,
  91.        JC   END_CONV     ;AND EXIT
  92.  
  93. DIGIT:
  94.        MOV  SI,10        ;THE CHARACTER IS A DIGIT
  95.        PUSH DX
  96.        MUL  SI           ;  SO MULTIPLY AX BY 10
  97.                          ;NOTE-FIRST TIME THROUGH AX=0
  98.        JC   END_CONV1    ;EXIT IF RESULT IS TOO BIG  ******NOT IN BOOK
  99.        POP  DX
  100.        MOV  BL,DS:[BP]   ;FETCH ASCII CODE,  
  101.        AND  BX,0FH       ; SAVE ONLY HIGH BITS, 
  102.        ADD  AX,BX        ; AND UPDATE PARTIAL RESULTS
  103.        JC   END_CONV     ;EXIT IF RESULT IS TOO BIG
  104.        INC  BP           ;OTHERWISE, INCREMENT
  105.        LOOP CHK_PT       ; BP AND CONTINUE
  106.        CLC               ;WHEN DONE, CLEAR CARRY FLAG
  107.  
  108.        JMP END_CONV      ;                            ******NOT IN BOOK
  109.  
  110. END_CONV1:               ;                             *****NOT IN BOOK
  111.        POP  DX           ;TO KEEP STACK RIGHT          *****NOT IN BOOK
  112. END_CONV:
  113.        POP  SI           ;RESTORE REGISTERS
  114.        POP  BX
  115.        POP  BP
  116.        RET               ;RETURN TO CALLER
  117. CONV_AB ENDP
  118.  
  119. CODE ENDS
  120.       END
  121.